package cn.snowheart.singleton;

/**
 * 懒汉模式 - 第三版
 * 只有当instance为null时，才做sync，
 * 同时，做两次空值判定，既保证安全，又保证效率
 *
 * @author liuwanxiang
 * @version 2019/07/02
 */
public class SingletonV4 {

    private static SingletonV4 singletonV4;

    private int value;

    private SingletonV4() {
        value = 0;
    }

    public int increase() {
        return value++;
    }

    public static SingletonV4 getInstance() {
        if (singletonV4 == null) {
            // 使用sync方法来取代代码块，也没有问题
            // init();
            synchronized (SingletonV4.class) {
                if (singletonV4 == null) {
                    try {
                        // 线程sleep一段时间，再进行初始化操作
                        // 模拟实际过程中的一个实例加载所需要的时间
                        long times = (long) (Math.random() * 1000);
                        Thread.sleep(times);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    singletonV4 = new SingletonV4();
                }
            }
        }
        return singletonV4;
    }

    private static synchronized void init() {
        if (singletonV4 == null) {
            try {
                // 线程sleep一段时间，再进行初始化操作
                // 模拟实际过程中的一个实例加载所需要的时间
                long times = (long) (Math.random() * 1000);
                Thread.sleep(times);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            singletonV4 = new SingletonV4();
        }
    }

}
